import { IBreadcrumb } from '@/base-ui/breadcrumb/types/type'
import { RouteRecordRaw } from 'vue-router'

export let firstMenu: any = null
export function mapMenusToRoute(userMenus: any[]): RouteRecordRaw[] {
  // routes是我们最后筛选出的要注册的路由组
  const routes: RouteRecordRaw[] = []

  // 1. 先去加载所有的routes
  // 通过require的context方法可以获取指定文件夹的所有路径
  // 参数1：搜索的目录
  // 参数2：是否开启深层搜索，默认false
  // 参数3：匹配文件的正则
  // 我们这里定义一个路由组，用于保存所有获取到的路由
  const allRoutes: RouteRecordRaw[] = []
  const allFiles = require.context('@/router/main', true, /\.ts/)
  // 通过固定方式获取到匹配的模块
  allFiles.keys().forEach((key) => {
    // 通过require直接导入这些模块并push到allRoutes中
    const route = require('@/router/main' + key.split('.')[1])
    // 注意：我们模块默认所暴露的内容实际上在default属性上！
    allRoutes.push(route.default)
  })
  // 2. 再通过用户menus筛选出它所拥有的权限
  //  筛选说明：type属性 === 2的
  //          url和route相同
  // 封装一个方法，该方法递归遍历并筛选出用户权限和所有路由的比对，拥有的用户权限就会被筛选出，然后push到routes中
  function _recurse(menus: any[]) {
    for (const menu of menus) {
      if (menu.type === 2) {
        const route = allRoutes.find((route) => route.path === menu.url)
        if (route) routes.push(route)
        // 获取第一遍循环的menu，保存至firstMenu
        if (!firstMenu) {
          firstMenu = menu
        }
      } else {
        _recurse(menu.children)
      }
    }
  }
  _recurse(userMenus)

  // 最后我们的routes就是经过筛选后的路由映射组了
  return routes
}

// 定义一个方法，它能够根据路径匹配到我们刷新之前的路由的id
// 参数1要求：传递一个menus
// 参数2要求：需要查找的路由路径
export function pathMapToMenu(
  userMenus: any[],
  path: string,
  breadcrumbs?: IBreadcrumb[]
): any {
  for (const menu of userMenus) {
    if (menu.type === 1) {
      const findMenu = pathMapToMenu(menu.children ?? [], path)
      if (findMenu) {
        breadcrumbs?.push({ name: menu.name })
        breadcrumbs?.push({ name: findMenu.name })
        return findMenu
      }
    } else if (menu.type === 2 && menu.url === path) {
      return menu
    }
  }
}

// 封装一个方法，用于获取当前路径的menu和它的父级路径的menu
export function pathMapToBreadcrumb(
  userMenus: any[],
  path: string
): IBreadcrumb[] {
  const breadcrumbs: IBreadcrumb[] = []
  pathMapToMenu(userMenus, path, breadcrumbs)
  return breadcrumbs
}
